package reflect;

import java.io.File;
import java.io.FileFilter;
import java.lang.reflect.Constructor;
import java.net.URISyntaxException;

/*
* 类对象的常用功能
* 1:获取类加载在路径
* 2.获取当前类的字节码文件所在的目录
* */
public class test {
    public static void main(String[] args) throws URISyntaxException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        //获取当前你嘞的类加载路径，就是当前类的包所在的上一级别
//        File dir = new File(
//                test.class.getClassLoader().getResource(".").toURI()
//        );
        //获取当前test的字节码文件所在的目录
//        File dir = new File(
//                test.class.getResource(".").toURI()
//        );

        /*
        * 完成功能
        * 实例化与当前Test类所在同一个包中的所有类(仅无惨构造器实例化就可以)
        * */
        File dir = new File(
                test.class.getResource(".").toURI() //获取test类所在的目录路径
        );
        String packgeName =     //因为我们想获取到的是和test这个类同包下的所有的类实例对象，此处直接获取test所在的包名就可以
                test.class.getPackage().getName();
        File[] files = dir.listFiles(f -> f.getName().endsWith(".class"));  //获取test所在的目录中所有字节码文件名
        for(File f:files){
            String fileName = f.getName();  //使用文件对象的getName方法获取当前文件名
            String className = fileName.substring(0,fileName.indexOf(".")); //截取.class之前的文件名
            Class cls = Class.forName(packgeName+"."+className);    //用获取到的test包路径+"."+文件名，来获取类对象
            Object o = cls.newInstance();   //根据类对象使用NewInstance()方法创建新的实例
            System.out.println(o);  //但因测试
        }

        //自己写的
        /*File[] files = dir.listFiles();
        for (File f:files
             ) {
            String str = f.getName();
            str =str.substring(0,str.indexOf("."));
            Class cls = Class.forName("reflect."+str);
            //Constructor c = cls.getConstructor(参数，参数。。。。); 可以根据你给定的参数找到对应参数数量的构造器
            Object o = cls.newInstance();
            System.out.println(o);
        }*/

    }
}
